package com.epcs.listener;

import javax.servlet.http.HttpSession;

import com.epcs.model.bo.SettingBO;
import com.epcs.model.bo.SynchronizationBO;
import com.epcs.model.dto.Account;
import com.epcs.model.dto.Setting;
import com.epcs.util.EpcsDateTimeUtil;

public class AutoSync implements Runnable {

	private HttpSession currentSession;
	private long minutes;
	private int result;
	private boolean autoSync = false;
	private boolean stop = false;

	@Override
	public void run() {
		SynchronizationBO syncBO = new SynchronizationBO();
		SettingBO settingBO = new SettingBO();
		try {
			while (!stop) {
				System.out.println("-----Trước Đồng bộ "+EpcsDateTimeUtil.getCurrentIsoByPattern("HH:mm dd/MM/yyyy")+"----");
				
				Thread.sleep(minutes);
				if (currentSession != null) {
					// lấy session user
					Account user_info = (Account) currentSession.getAttribute("USER_INFO");
					if (user_info != null) {
						// lấy setting
						Setting setting = settingBO.getSetting(user_info);
						if (setting != null) {
							// lấy Setting minutes để cập nhật thời gian tự đồng bộ
							this.minutes = setting.getSyncAfter() * 60000;
							System.out.println("new minutes =" + minutes);
							
							// set autoSync
							this.autoSync = setting.isIsAutoSync();
							
							// nếu cho phép tự động sync
							if (autoSync) {
								//------------- thực hiện đồng bộ ---------------//
								// check email của user có thỏa yêu cầu trước khi sync không
								int result = syncBO.checkEmailBeforeSync(user_info);
								if (result == 1) {
									// bắt đầu sync
									currentSession.setAttribute("SYNC_STATUS", "Running");
									syncBO.synchronize(user_info);
									currentSession.removeAttribute("SYNC_STATUS");
									
								}
							}
							
						}
					}
				} else {
					// hết session thì tự ngắt
					this.stop = true;
				}
				System.out.println("-----Kết thúc Đồng bộ lúc "+EpcsDateTimeUtil.getCurrentIsoByPattern("HH:mm dd/MM/yyyy")+"----");
			}
		} catch (Exception e) {
			System.out.println("ERROR thread: " + e.getMessage());
			
			// hết session thì tự ngắt
			this.stop = true;			
		}
		
		System.out.println("Stop auto sync");
	}
	
	 

	public AutoSync(HttpSession currentSession) {
		super();
		this.currentSession = currentSession;
		
		SettingBO settingBO = new SettingBO();
		Account user_info = (Account) currentSession.getAttribute("USER_INFO");
		if (user_info != null) {
			// lấy setting
			Setting setting = settingBO.getSetting(user_info);
			if (setting != null) {
				// lấy Setting minutes để cập nhật thời gian tự đồng bộ
				this.minutes = setting.getSyncAfter() * 60000;				
				this.autoSync = setting.isIsAutoSync();
			} else {
				this.minutes = 1800000; // 30 phút
				this.autoSync = true;
			}
		} else {
			this.minutes = 1800000; // 30 phút
			this.autoSync = true;
		}
	}



	public boolean getStop() {
		return stop;
	}

	public void setStop(boolean stop) {
		this.stop = stop;
	}


	public HttpSession getCurrentSession() {
		return currentSession;
	}


	public void setCurrentSession(HttpSession currentSession) {
		this.currentSession = currentSession;
	}

}
